#ifndef P3HEAD_H
#define P3HEAD_H
#include <windows.h>
#include <winioctl.h> //DDK驱动开发与控制
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <stdint.h>
#include <cstring>
#define onesector 512 //一个扇区512字节 

uint8_t lpBuffer[onesector] = { 0 };//用于读512字节 
uint8_t lpBuffer2[onesector] = { 0 };//用于临时读512字节 
int clusterChain[1000] = {0}; //用于保存簇链
unsigned int length;  //文件长度


//DBR结构，EBR应该也是类似管理 
struct DBR {
	uint8_t jumpcode[3];//EB 58 90
	uint8_t OEM[8];//OEM代号
	uint8_t bytes_per_sector[2];//扇区字节数
	uint8_t secotrs_per_cluster;//每簇扇区数
	uint8_t reserve_sectors[2];//包括DBR自己在内的FAT之前的扇区个数
	uint8_t FATnum;//FAT个数，一般为2 
	uint8_t unimportant1[11];
	uint8_t DBR_LBA[4];//该分区的DBR所在的相对扇区号，如果是扩展分区，是相对于扩展分区首的
	uint8_t totalsectors[4];//本分区的总扇区数
	uint8_t sectors_per_FAT[4];//每个FAT的扇区数
	uint8_t unimportant2[4];
	uint8_t root_cluster_number[4];//根目录簇号
	uint8_t file_info[2];
	uint8_t backup_DBR[2];//备份引导扇区的相对于DBR的扇区号，一般为6，内容和DBR一模一样
	uint8_t zero1[12];
	uint8_t extBPB[26];//扩展BPB
	uint8_t osboot[422];//引导代码和55AA 
};

struct DBR the_DBR;

struct FDT {
	char content[32];
};

//短文件目录项32字节
struct shortFDT {
	uint8_t filename[8];//第一部分文件名
	uint8_t extname[3];//文件扩展名
	uint8_t attr;//属性 0F则说明是长文件需要索引到非0F，然后倒着读回来
	uint8_t reserve;
	uint8_t time1;
	uint8_t creattime[2];
	uint8_t createdate[2];
	uint8_t visittime[2];
	uint8_t high_cluster[2];//文件起始簇号高16位
	uint8_t changetim2[2];
	uint8_t changedate[2];
	uint8_t low_cluster[2];//文件起始簇号低16位
	uint8_t filelen[4];//文件长度
};

struct longFDT {
	char flag;//如果是0x4*,第6位置位了，说明是最后一个长文件目录，各位是下面还有几个
	char name1[10];
	char attr;//如果是长文件名，除了最下面一个，都是0F
	char reserve;
	char checksum;
	char name2[12];
	char rel_cluster[2];//相对起始簇号
	char name3[4];
};

struct findfilepath {
	char prename[100];
	char rearname[10];
};

uint16_t uint8to16(uint8_t twouint8[2]) {
	return *(uint16_t*)twouint8;
}

uint32_t uint8to32(uint8_t fouruint8[4]) {
	return *(uint32_t*)fouruint8;
}
#endif

